import marimo

__generated_with = "0.9.27"
app = marimo.App(width="medium")


@app.cell
def __():

    bool(-1)

    # True == 1
    a = 1 + True
    a



    a = 'world'

    b = 'hello'

    b = 'yellow'


    # 比较字符串的大小=比较字符unicode，
    # 先比较第一个字符，比较不出来，比较第2个，直到比较出来

    a > b

    return a, b


@app.cell
def __():
    # 短路设计

    _a = 2

    # 1>2为false,不再计算后面
    if 1>2 and 2<3:
        _a = 4

    # 1<2为true,不再计算后面
    if 1<2 or 2>3:
        _a = 7

    _a
    return


@app.cell
def __():
    # 赋值运算符

    _a = 2
    _b = 1

    _a += _b + 3
    _a
    return


@app.cell
def __():

    _a = 'helxlo'

    # 最后一个字符,此处书中是错的！
    max(_a)

    # 第一个字符
    # min(_a)
    return


@app.cell
def __():
    _list = [20, 45, 67, 34]

    # 追加1个元素
    # _list.append(7)



    _a = [7, 9, 6, 4]



    # 作为子列表追加
    # _list.append(_a)

    # 追加多个元素
    # _list.extend(_a)

    # 追加多个元素
    _list += _a


    _list
    return


@app.cell
def __():
    # 16进制转换

    # 10进制转换，报错
    # int('ab')


    # 16进制转换，结果是10进制171，如何让结果转为16进制
    int('ab', 16)

    # 报错
    # hex('ab')

    # 输出16进制显示
    hex(int('ab', 16))

    _a = 0x1a7
    print(f'{_a:#x}')
    return


@app.cell
def __():
    # 类变量

    class Account():

        # 类变量
        interest_r = 0.0568

        def __init__(self, owner_o, amount_o):
            self.owner = owner_o
            self.amount = amount_o


        # 类方法, 第一个参数必须是cls, 类本身
        @classmethod
        def interest_by(cls, amt):
            return cls.interest_r * amt

    acc_1 = Account('tony', 800_000.0)


    # 类变量通过类访问
    print(f'利率：{Account.interest_r}')


    # 调用类方法
    # 类方法可以访问类变量和其他类方法,不能访问实例变量和实例方法
    interest_1 = Account.interest_by(12_000.0)

    print(f'计算利息: {interest_1}')
    return Account, acc_1, interest_1


@app.cell
def __():
    # 私有变量

    class Dog():

        def __init__(self, name_o, age_o, sex='雌'):
            self.name = name_o
            self.__age = age_o

        def run(self):
            print(f'{self.name}在跑...')


        # 提取属性的装饰器
        # @property
        # @age.getter,没有这个装饰器么?我记得有个视频
        def age(self):
            return self.__age

        # 修改属性的装饰器
        @age.setter
        def age(self, age):
            self.__age = age


    dog_1 = Dog('球球', 2)
    # 有装饰器后,可这样提取
    print(f'年龄: {dog_1.age}')

    # 赋值失败
    # dog_1.age(3)

    # 有装饰器后,可这样修改
    dog_1.age = 3
    print(f'修改后年龄: {dog_1.age}')
            
    return Dog, dog_1


@app.cell
def __():
    # 类的继承
    # 不建议子类继承多个父类,如果在多个父类中有相同的成员方法或成员变量，则子类优先继承左边父类中的成员方法或成员变量，从左到右继承级别从高到低。
    return


@app.cell
def __():
    # 异常
    # 不指定异常类型,Exception可捕获所有异常,推荐指定异常类型
    # 有时在try-except语句中会占用一些资源，例如打开的文件、网络连接、打开的数据库及数据结果集等都会占用计算机资源，需要程序员释放这些资源。为了确保这些资源能够被释放，可以使用finally代码块。


    i = input('请输入数字:')
    n = 8888

    try:
        result = n/int(i)
        print(result)
        print(f'{n}除以{i}等于{result}')
        
    except ZeroDivisionError as e:
        print(f'不能除以0,异常{e}')

    except ValueError as e:
         print(f'数据类型错误,异常{e}')
    return i, n, result


@app.cell
def __(i):
    # 手动引发异常

    class Cust_exc(Exception):
        def __init__(self, msg_o):
            super().__init__(msg_o)


    _i = input('请输入数字:')
    _n = 8888

    try:
        _result = _n/int(_i)
        print(_result)
        print(f'{_n}除以{i}等于{_result}')
        
    except ZeroDivisionError as e:

        # 直接使用类
        # 会弹出错误,使用体验不好
        raise Cust_exc('不能除以0')

    except ValueError as e:
         raise Cust_exc('输入类型错误')
    return (Cust_exc,)


@app.cell
def __():
    return


if __name__ == "__main__":
    app.run()
